home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
utilsys
/
rss14gmd.lha
/
RSys_1.4gmd
/
C
/
Modify.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-04
|
24KB
|
1,108 lines
/*
***************************************************************************
*
* Datei:
* RSysModify.c
*
* Inhalt:
*
* --- Globale Routinen ---
*
* int CheckWindow ( WINDOW *findwin );
* void CountAssocObjects ( TASK *task , int *wins , int *scrs , int *ports );
* void ModifyObject ( int TypeID , ULONG code );
*
* --- Lokale Routinen ---
*
* static BOOL CheckObject ( LIST *list , RSYS_Objid *obj );
* static BOOL CheckTask ( RSYS_Objid *obj );
* static int CheckScreen ( SCREEN *findscr );
* static int OpenChgPriWindow ( void );
* static MSGPORT *TaskPort ( TASK *task );
* static WINDOW *TaskWindow ( TASK *task );
* static void ChangePri ( RSYS_Objid *obj );
* static void ClosingScreens ( SCREEN *scr );
* static void ClosingWindows ( WINDOW *wind );
* static void DisplayAllFonts ( int TypeID , NODE *ClickedNode );
* static void DisplayResource ( int TypeID , RSYS_Objid *obj );
* static void DisplaySoftDevice ( int TypeID , RSYS_Objid *obj );
* static void DisplayTreeDevice ( int TypeID , RSYS_Objid *obj );
* static void FlushLibrary ( RSYS_Objid *obj );
* static void KillTask ( RSYS_Objid *obj );
* static void ModifyFont ( int TypeID , RSYS_Objid *obj );
* static void ModifyLibrary ( int TypeID , RSYS_Objid *obj );
* static void ModifyPort ( int TypeID , RSYS_Objid *obj );
* static void ModifyScreen ( int TypeID , RSYS_Objid *obj );
* static void ModifyTask ( int TypeID , RSYS_Objid *obj );
* static void ModifyVolumeLock ( int TypeID , RSYS_Objid *obj );
* static void ModifyWindow ( int TypeID , RSYS_Objid *obj );
* static void RemoveFontSafely ( TEXTFONT *tf );
* static void RemovePortSafely ( MSGPORT *p , RSYS_Objid *obj );
* static void SignalTask ( RSYS_Objid *obj , ULONG signal );
*
* Bemerkungen:
* Enthält die Routinen zum Modifizieren von Objekten.
*
* Erstellungsdatum:
* 07-Jan-93 Rolf Böhme
*
* Änderungen:
* 07-Jan-93 Rolf Böhme Erstellung
*
***************************************************************************
*/
#include "RSys.h"
#include "protos.h"
static void KillTask (RSYS_Objid *);
static int modified = FALSE;
/*
* CheckObject() prüft, ob ein ausgewähltes Listenelement (Objekt)
* sich noch in der Liste befindet
*/
static BOOL
CheckObject (LIST * list, RSYS_Objid * obj)
{
NODE *node;
BOOL retval; /*GMD */
Forbid ();
for (node = list->lh_Head; node->ln_Succ && (node != obj->address); node = node->ln_Succ);
Permit ();
retval = ((node == obj->address) ? TRUE : FALSE);
return retval;
}
/*
* CheckTask() prüft, ob ein Task-Objekt sich noch in den Listen
* befindet, also noch existiert
*/
static BOOL
CheckTask (RSYS_Objid * obj)
{
if (CheckObject (&(SysBase->TaskWait), obj) || CheckObject (&(SysBase->TaskReady), obj) ||
((TASK *) obj->address == FindTask (NULL)))
return (TRUE);
else
return (FALSE);
}
/*
* CountAssocObjects() zählt die zu einem Task gehörenden
* Windows, Screens und Ports
*/
void
CountAssocObjects (TASK * task, int *wins, int *scrs, int *ports)
{
ULONG lock;
WINDOW *win;
SCREEN *scr;
MSGPORT *port;
NODE *node;
DPOS;
Forbid ();
lock = LockIBase (NULL);
for (scr = IntuitionBase->FirstScreen; scr; scr = scr->NextScreen)
for (win = scr->FirstWindow; win; win = win->NextWindow)
{
if (win->UserPort && win->UserPort->mp_SigTask &&
(win->UserPort->mp_SigTask == task))
{
(*wins)++;
if ((scr->Flags & CUSTOMSCREEN) && NOT (scr->Flags & PUBLICSCREEN))
(*scrs)++;
}
}
UnlockIBase (lock);
for (node = SysBase->PortList.lh_Head; node->ln_Succ; node = node->ln_Succ)
{
port = (MSGPORT *) node;
if (port->mp_SigTask && (port->mp_SigTask == task))
(*ports)++;
}
Permit ();
return;
}
/*
* CheckWindow() prüft, ob ein Fenster noch existiert, und zwar
* auf allen Screens
*/
int
CheckWindow (WINDOW * findwin)
{
ULONG lock;
WINDOW *win;
SCREEN *scr;
int ret = FALSE;
DPOS;
lock = LockIBase (NULL);
for (scr = IntuitionBase->FirstScreen; scr && NOT (ret); scr = scr->NextScreen)
for (win = scr->FirstWindow; win && NOT (ret); win = win->NextWindow)
if (win == findwin)
ret = TRUE;
UnlockIBase (lock);
return ret;
}
/*
* CheckScreen() prüft, ob ein Screen noch existiert
*/
static int
CheckScreen (SCREEN * findscr)
{
ULONG lock;
SCREEN *scr;
int ret = FALSE;
lock = LockIBase (NULL);
for (scr = IntuitionBase->FirstScreen; scr && NOT (ret); scr = scr->NextScreen)
if (scr == findscr)
ret = TRUE;
UnlockIBase (lock);
return ret;
}
/*
* TaskPort() sucht in der Liste der öffentlichen Ports
* nach dem ersten Port, der den Task task als Signaltask
* hat
*/
static MSGPORT *
TaskPort (TASK * task)
{
MSGPORT *taskport = NULL, *port;
NODE *node;
Forbid ();
for (node = SysBase->PortList.lh_Head; node->ln_Succ; node = node->ln_Succ)
{
port = (MSGPORT *) node;
if (port->mp_SigTask && (port->mp_SigTask == task))
{
taskport = port;
break;
}
}
Permit ();
return taskport;
}
/*
* TaskWindow() sucht in der IntuitionBase nach dem ersten Fenster,
* dessen UserPort zu dem Task task gehört
*/
static WINDOW *
TaskWindow (TASK * task)
{
ULONG lock;
WINDOW *win, *taskwindow = NULL;
SCREEN *scr;
lock = LockIBase (NULL);
for (scr = IntuitionBase->FirstScreen; scr && NOT (taskwindow); scr = scr->NextScreen)
for (win = scr->FirstWindow; win && NOT (taskwindow); win = win->NextWindow)
if (win->UserPort && (win->UserPort->mp_SigTask) && (win->UserPort->mp_SigTask == task))
taskwindow = win;
UnlockIBase (lock);
return taskwindow;
}
/*
* ClosingWindows() schließt ein Fenster auf sicherste
* Weise, wie ich hoffe...
*/
static void
ClosingWindows (WINDOW * wind)
{
if (CheckWindow (wind))
{
if ((wind->ReqCount != 0) && wind->FirstRequest)
while (wind->ReqCount != 0)
EndRequest (wind->FirstRequest, wind);
if (wind->DMRequest)
ClearDMRequest (wind);
if (wind->Pointer)
ClearPointer (wind);
if (wind->MenuStrip)
ClearMenuStrip (wind);
CloseWindow (wind);
}
else
ErrorHandle ("CheckWindow()", WINDOW_ERR, FIND_FAIL, NO_KILL);
return;
}
/*
* ClosingScreens() schließt einen Screen auf sicherste
* Weise, wie ich hoffe...
*/
static void
ClosingScreens (SCREEN * scr)
{
WINDOW *win = scr->FirstWindow, *markwin;
if (CheckScreen (scr))
{
while (win)
{
markwin = win->NextWindow;
ClosingWindows (win);
win = markwin;
}
CloseScreen (scr);
if (CheckScreen (scr))
PrintInfo ("Screen not killed!", SPEAK, SEC);
}
else
ErrorHandle ("CheckScreen", SCREEN_ERR, FIND_FAIL, NO_KILL);
return;
}
/*
* RemovePortSavely() entfernt eine Port auf sicherste Weise
*/
static void
RemovePortSafely (MSGPORT * p, RSYS_Objid * obj)
{
NODE *MsgNode;
MSGPORT *port;
port = (obj ? (MSGPORT *) obj->address : p);
Forbid ();
if (NOT (IsMsgPortEmpty (port)))
{
MsgNode = port->mp_MsgList.lh_Head;
while (MsgNode = MsgNode->ln_Succ)
Remove ((NODE *) MsgNode);
}
DeletePort (port);
if (CheckObject (&SysBase->PortList, obj))
RemPort (port);
Permit ();
return;
}
static void
RemoveFontSafely (TEXTFONT * tf)
{
if (tf->tf_Flags & FPF_DISKFONT)
{
Forbid ();
CloseFont (tf);
Remove ((NODE *) tf);
Permit ();
}
else if (Question (SysWnd, "You attempt to remove a ROM-Font!\n"
"Remove this Font anyway?", YES))
{
Forbid ();
RemFont (tf);
Remove ((NODE *) tf);
Permit ();
}
return;
}
/*
* KillTask() entfernt einen Task aund alle mit ihm verbundenen
* Windows, Screens und Ports. Alle anderen Resourcen können
* nicht mehr eindeutig zugeordnet werden
*/
static void
KillTask (RSYS_Objid * obj)
{
TASK *task = (TASK *) obj->address;
WINDOW *taskwin;
MSGPORT *port;
if (Question (SysWnd, "Break signal failed!\n"
"Do you really want to kill the task harder?", YES))
if (CheckTask (obj))
{
Forbid ();
Disable ();
Remove ((NODE *) task);
Enable ();
if (taskwin = TaskWindow (task))
{
SCREEN *taskscr = NULL;
ULONG lock = LockIBase (NULL);
if (taskwin->WScreen && (taskwin->WScreen->Flags & CUSTOMSCREEN))
taskscr = taskwin->WScreen;
while (taskwin)
{
ClosingWindows (taskwin);
taskwin = TaskWindow (task);
}
if (taskscr)
CloseScreen (taskscr);
UnlockIBase (lock);
}
while (port = TaskPort (obj->address))
RemovePortSafely (port, NULL);
Disable ();
RemTask (task);
Enable ();
Permit ();
}
else
ErrorHandle ("CheckTask()", TASK_ERR, FIND_FAIL, NO_KILL);
return;
}
/*
* SignalTask() sendet eine Signal signal an den Task obj
*/
static void
SignalTask (RSYS_Objid * obj, ULONG signal)
{
TASK *task;
if (task = FindTask ((UBYTE *) obj->fullname))
Signal (task, signal);
else
ErrorHandle (obj->fullname, TASK_ERR, FIND_FAIL, NO_KILL);
return;
}
static WINDOW *ChgPriWnd = NULL;
static GADGET *ChgPriGList = NULL;
static GADGET *ChgPriGadgets[5];
static UWORD ChgPriLeft = 195;
static UWORD ChgPriTop = 71;
static UWORD ChgPriWidth = 228;
static UWORD ChgPriHeight = 55;
static UBYTE ChgPriWdt[100]; /*GMD */
static UWORD ChgPriGTypes[] =
{
TEXT_KIND,
SLIDER_KIND,
BUTTON_KIND,
BUTTON_KIND,
INTEGER_KIND
};
static NEWGADGET ChgPriNGad[] =
{
52, 5, 169, 13, (UBYTE *) "Task", NULL, GD_TaskGad, PLACETEXT_LEFT, NULL, NULL,
52, 21, 129, 13, (UBYTE *) "Prio", NULL, GD_PrioGad, NG_HIGHLABEL, NULL, NULL,
8, 37, 69, 13, (UBYTE *) "Ok", NULL, GD_OkGad, PLACETEXT_IN, NULL, NULL,
156, 37, 65, 13, (UBYTE *) "Cancel", NULL, GD_CancelPriGad, PLACETEXT_IN, NULL, NULL,
88, 37, 57, 13, NULL, NULL, GD_PriIntGad, 0, NULL, NULL
};
static ULONG *ChgPriGTags[] =
{
(ULONG *) (GTTX_Text), (ULONG *) NULL,
(ULONG *) (GTTX_Border), (ULONG *) TRUE,
(ULONG *) (TAG_DONE),
(ULONG *) (GTSL_Min), (ULONG *) (-128),
(ULONG *) (GTSL_Max), (ULONG *) 128,
(ULONG *) (GTSL_MaxLevelLen), (ULONG *) 4,
(ULONG *) (GTSL_LevelFormat), (ULONG *) "%4ld",
(ULONG *) (GTSL_LevelPlace), (ULONG *) (PLACETEXT_RIGHT),
(ULONG *) (PGA_Freedom), (ULONG *) LORIENT_HORIZ,
(ULONG *) (GA_Immediate), (ULONG *) TRUE,
(ULONG *) (GA_RelVerify), (ULONG *) TRUE,
(ULONG *) (TAG_DONE),
(ULONG *) (TAG_DONE),
(ULONG *) (TAG_DONE),
(ULONG *) (GTIN_Number), (ULONG *) 0,
(ULONG *) (GTIN_MaxChars), (ULONG *) 5,
(ULONG *) (TAG_DONE)
};
/*
* OpenChgPriWindow() öffnet ein kleines Fenster, in
* dem man mit einem Slider die Priorität eines Tasks einstellen
* kann
*/
static int
OpenChgPriWindow (void)
{
NEWGADGET ng;
GADGET *g;
UWORD lc, tc;
UWORD wleft = ChgPriLeft, wtop = ChgPriTop, ww, wh;
int gl[] =
{GD_TaskGad - GD_TaskGad,
GD_PriIntGad - GD_TaskGad,
GD_PrioGad - GD_TaskGad};
AdjustWindowDimensions (Scr, ChgPriLeft, ChgPriTop, ChgPriWidth, ChgPriHeight,
&wleft, &wtop, &ww, &wh);
if (!(g = CreateContext (&ChgPriGList)))
return 1L;
for (lc = 0, tc = 0; lc < ChgPri_CNT; lc++)
{
CopyMem ((char *) &ChgPriNGad[lc], (char *) &ng,
(long) sizeof (NEWGADGET));
ng.ng_VisualInfo = VisualInfo;
ng.ng_TextAttr = Font;
ng.ng_LeftEdge = OffX + ComputeX (ng.ng_LeftEdge);
ng.ng_TopEdge = OffY + ComputeY (ng.ng_TopEdge);
ng.ng_Width = ComputeX (ng.ng_Width);
ng.ng_Height = ComputeY (ng.ng_Height);
ChgPriGadgets[lc] = g = CreateGadgetA ((ULONG) ChgPriGTypes[lc], g, &ng, (TAGITEM *) & ChgPriGTags[tc]);
makelabelvisible (ChgPriGadgets[lc]);
while (ChgPriGTags[tc])
tc += 2;
tc++;
if (NOT g)
return 2L;
}
strcpy (ChgPriWdt, get_vers (" - Change priority")); /*GMD */
if (!(ChgPriWnd = OpenWindowTags (NULL,
WA_Left, wleft,
WA_Top, wtop,
WA_Width, ww,
WA_Height, wh,
WA_IDCMP, TEXTIDCMP |
SLIDERIDCMP |
BUTTONIDCMP |
INTEGERIDCMP |
IDCMP_CLOSEWINDOW |
IDCMP_REFRESHWINDOW,
WA_Flags, WFLG_DRAGBAR |
WFLG_DEPTHGADGET |
WFLG_CLOSEGADGET |
WFLG_SMART_REFRESH |
WFLG_ACTIVATE |
WFLG_RMBTRAP,
WA_Title, ChgPriWdt,
WA_PubScreenFallBack, TRUE,
WA_PubScreen, Scr,
TAG_DONE)))
return 4L;
RefreshRastPort (ChgPriWnd, ChgPriGadgets, gl, 3, FALSE, ChgPriGList);
return (0L);
}
/*
* ChangePri() öffnet ein Fenster und managed das
* Priority-Handling für ein gewähltes Objekt obj
*/
static void
ChangePri (RSYS_Objid * obj)
{
TASK *task = (TASK *) obj->address;
int TaskPri = task->tc_Node.ln_Pri, OldPri = TaskPri;
INTUIMESSAGE *message;
ULONG class, code;
APTR object;
Flags.quit_cp = 0;
if (OpenASysWindow (OpenChgPriWindow, NO_KILL))
{
LockMainWindow (WIN_LOCK);
GT_SetGadgetAttrs (ChgPriGadgets[GD_TaskGad - GD_TaskGad], ChgPriWnd, NULL,
GTTX_Text, (UBYTE *) obj->fullname,
TAG_DONE);
GT_SetGadgetAttrs (ChgPriGadgets[GD_PrioGad - GD_TaskGad], ChgPriWnd, NULL,
GTSL_Level, (UBYTE *) TaskPri,
TAG_DONE);
GT_SetGadgetAttrs (ChgPriGadgets[GD_PriIntGad - GD_TaskGad], ChgPriWnd, NULL,
GTIN_Number, (UBYTE *) TaskPri,
TAG_DONE);
do
{
Wait (1L << ChgPriWnd->UserPort->mp_SigBit);
while ((message = (INTUIMESSAGE *)
GT_GetIMsg (ChgPriWnd->UserPort)) != NULL)
{
object = message->IAddress;
class = message->Class;
code = message->Code;
GT_ReplyIMsg (message);
switch (class)
{
case IDCMP_GADGETUP:
switch (((GADGET *) object)->GadgetID)
{
case GD_PrioGad:
TaskPri = (int) ((char) code);
GT_SetGadgetAttrs (ChgPriGadgets[GD_PriIntGad - GD_TaskGad], ChgPriWnd,
NULL,
GTIN_Number, (int) TaskPri,
TAG_DONE);
break;
case GD_OkGad:
Flags.quit_cp = 1;
break;
case GD_CancelPriGad:
TaskPri = OldPri;
Flags.quit_cp = 1;
break;
case GD_PriIntGad:
TaskPri = (int) ((STRINGINFO *)
(((GADGET *)
object)->SpecialInfo))->LongInt;
if ((TaskPri < -128) || (TaskPri > 127))
GT_SetGadgetAttrs (ChgPriGadgets[GD_PriIntGad - GD_TaskGad],
ChgPriWnd,
NULL,
GTIN_Number, OldPri,
TAG_DONE);
else
GT_SetGadgetAttrs (ChgPriGadgets[GD_PrioGad - GD_TaskGad], ChgPriWnd,
NULL,
GTSL_Level, TaskPri,
TAG_DONE);
break;
}
break;
case IDCMP_CLOSEWINDOW:
TaskPri = OldPri;
Flags.quit_cp = 1;
break;
}
}
}
while (NOT (Flags.quit_cp));
CloseASysWindow (&ChgPriWnd, &ChgPriGList, NULL);
if (CheckTask (obj) && (TaskPri != OldPri))
SetTaskPri (task, TaskPri);
LockMainWindow (WIN_UNLOCK);
}
return;
}
/*
* FlushLibrary() entfernt eine geschlossene Library aus
* dem System
*/
static void
FlushLibrary (RSYS_Objid * obj)
{
LIBRARY *result;
if (Question (SysWnd, "Do you really want to remove the Library?", YES))
{
Forbid ();
result = (LIBRARY *) FindName (&SysBase->LibList, (UBYTE *) obj->fullname);
if (result && (result->lib_OpenCnt == 0))
RemLibrary (result);
Permit ();
if (!result)
ErrorHandle (obj->fullname, LIBRARY_ERR, FIND_FAIL, NO_KILL);
}
return;
}
static void
ModifyTask (int TypeID, RSYS_Objid * obj)
{
WORD sel;
ULONG signals[5] =
{
SIGBREAKF_CTRL_C, SIGBREAKF_CTRL_D, SIGBREAKF_CTRL_E, SIGBREAKF_CTRL_F,
(SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D | SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F)
};
if (CheckTask (obj))
{
sel = DisplayTaskInfo (obj);
switch (sel)
{
case 1:
if (obj->address != FindTask (NULL))
{
SignalTask (obj, signals[4]);
Delay (SEC);
if (CheckTask (obj))
KillTask (obj);
else
PrintInfo ("Break signal killed the task!", SPEAK, 2 * SEC);
modified = TRUE;
}
else
ErrorHandle (obj->fullname, OWN_OBJECT_ERR, KILL_FAIL, NO_KILL);
break;
case 0:
break;
case 2:
case 3:
case 4:
case 5:
SignalTask (obj, signals[sel - 2]);
modified = TRUE;
break;
case 6:
if (CheckTask (obj))
ChangePri (obj);
else
ErrorHandle (obj->fullname, TASK_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
break;
case 7:
modified = TRUE;
break;
}
return;
}
else
ErrorHandle (obj->fullname, TASK_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
return;
}
static void
ModifyLibrary (int TypeID, RSYS_Objid * obj)
{
if (CheckObject (&SysBase->LibList, obj))
{
if (DisplayLibraryInfo (obj))
FlushLibrary (obj);
}
else
ErrorHandle (obj->fullname, LIBRARY_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
return;
}
static void
DisplaySoftDevice (int TypeID, RSYS_Objid * obj)
{
if (CheckObject (&SysBase->DeviceList, obj))
DisplaySoftDevInfo (obj);
else
{
ErrorHandle ("Soft Device", DEVICE_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
}
return;
}
static void
DisplayResource (int TypeID, RSYS_Objid * obj)
{
if (CheckObject (&SysBase->ResourceList, obj))
DisplayResourceInfo (obj);
else
{
ErrorHandle ("Resource", DEVICE_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
}
return;
}
static void
ModifyPort (int TypeID, RSYS_Objid * obj)
{
WORD sel;
if (CheckObject (&SysBase->PortList, obj))
{
sel = DisplayPortInfo (obj);
if (sel && ((obj->address == SysIdPort) || (obj->address == broker_mp) ||
(strstr (obj->fullname, "RSYS") != NULL)))
{
ErrorHandle (obj->fullname, OWN_OBJECT_ERR, MODIFY_FAIL, NO_KILL);
return;
}
if (sel && Question (SysWnd, "Do you want to remove the Port?", YES))
{
if (CheckObject (&SysBase->PortList, obj))
RemovePortSafely (NULL, obj);
else
ErrorHandle (obj->fullname, PORT_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
}
}
else
{
ErrorHandle (obj->fullname, PORT_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
}
return;
}
static void
ModifyFont (int TypeID, RSYS_Objid * obj)
{
WORD sel;
TEXTFONT *tf = (TEXTFONT *) obj->address;
if (CheckObject (&GfxBase->TextFonts, obj))
sel = DisplayFontInfo (obj);
else
{
ErrorHandle (obj->fullname, FONT_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
return;
}
switch (sel)
{
case 1:
if (Question (SysWnd, "Do you want to close and remove this font?", YES))
{
if (CheckObject (&GfxBase->TextFonts, obj))
RemoveFontSafely (tf);
else
ErrorHandle (obj->fullname, FONT_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
}
break;
case 2:
if (CheckObject (&GfxBase->TextFonts, obj))
ShowFont ((TEXTFONT *) obj->address);
else
{
ErrorHandle (obj->fullname, FONT_ERR, FIND_FAIL, NO_KILL);
modified = TRUE;
}
break;
}
return;
}
static void
ModifyWindow (int TypeID, RSYS_Objid * obj)
{
WORD sel;
sel = DisplayWindowInfo (obj);
if (sel && ((WINDOW *) obj->address == SysWnd))
{
ErrorHandle ("Main window", OWN_OBJECT_ERR, MODIFY_FAIL, NO_KILL);
return;
}
if (sel && Question (SysWnd, "Closing of Windows are very dangerous! The System \n"
"may be crash, when you close an active Window\n"
"Do you want to close the Window anyway?", YES))
ClosingWindows ((WINDOW *) obj->address);
modified = TRUE;
return;
}
static void
ModifyScreen (int TypeID, RSYS_Objid * obj)
{
WORD sel;
sel = DisplayScreenInfo (obj);
if (sel && (((SCREEN *) obj->address == SysWnd->WScreen) ||
(((SCREEN *) obj->address)->Flags & WBENCHSCREEN)))
{
ErrorHandle ((char *) namebuffer, OWN_OBJECT_ERR, MODIFY_FAIL, NO_KILL);
return;
}
if (sel && Question (SysWnd, "Closing of Screens are very dangerous! The System \n"
"may be crash, when you close an active Screen with\n"
"all associated windows!\n"
"Do you want to close the Screen and Windows anyway?", YES))
{
ClosingScreens ((SCREEN *) obj->address);
modified = TRUE;
}
return;
}
static void
DisplayTreeDevice (int TypeID, RSYS_Objid * obj)
{
if (DisplayDiskInfo (obj->fullname, TRUE))
PrintTree (obj);
return;
}
static void
DisplayAllFonts (int TypeID, NODE * ClickedNode)
{
TEXTFONT *tf;
TEXTATTR testfont;
int i, j;
char fontname[MAXSTRLEN], size[5];
i = 0;
while (ClickedNode->ln_Name[i] != ' ')
{
fontname[i] = ClickedNode->ln_Name[i];
i++;
}
fontname[i] = STRINGEND;
testfont.ta_Name = (UBYTE *) fontname;
while (ClickedNode->ln_Name[i] == ' ')
i++;
while (ClickedNode->ln_Name[i] != ' ')
i++;
while (ClickedNode->ln_Name[i] == ' ')
i++;
j = 0;
while (ClickedNode->ln_Name[i] != ' ')
{
size[j] = ClickedNode->ln_Name[i];
i++;
j++;
}
size[j] = STRINGEND;
testfont.ta_YSize = atoi (size);
testfont.ta_Flags = 0;
testfont.ta_Style = 0;
tf = OpenDiskFont (&testfont);
if (tf)
{
ShowFont (tf);
CloseFont (tf);
}
return;
}
static void
ModifyVolumeLock (int TypeID, RSYS_Objid * obj)
{
if (DisplayLockInfo (obj) && Question (SysWnd, "Unlocking is very dangerous!\n"
"Do you really want to unlock this lock?", YES))
{
Forbid ();
UnLock ((BPTR) obj->address);
Permit ();
modified = TRUE;
}
return;
}
/*
* ModifyObject() prüft ob ein Element einer Liste im Hauptfenster
* modifiziert oder angezeigt werden kann und ruft die entsprechenden
* Routinen auf
*/
void
ModifyObject (int TypeID, ULONG code)
{
NODE *ClickedNode;
RSYS_Objid *obj;
char out[BUFSIZE]
DPOS;
modified = FALSE;
sprintf (out, "Modify %s", EntryAttr[TypeID].ea_type);
PrintInfo (out, SPEAK, 0);
if (NOT (ClickedNode = GetNode (&ListeLVList, code)))
{
ErrorHandle ("No Object found ???", LIST_NODE_ERR, FIND_FAIL, NO_KILL);
return;
}
obj = &((RSYS_ScrollEntry *) ClickedNode)->se_obj_id;
switch (TypeID)
{
case TASKS:
ModifyTask (TypeID, obj);
break;
case LIBRARIES:
ModifyLibrary (TypeID, obj);
break;
case SYSSOFTDEV:
DisplaySoftDevice (TypeID, obj);
break;
case RESOURCES:
DisplayResource (TypeID, obj);
break;
case PORTS:
ModifyPort (TypeID, obj);
break;
case FONTS:
ModifyFont (TypeID, obj);
break;
case WINDOWS:
ModifyWindow (TypeID, obj);
break;
case SCREENS:
ModifyScreen (TypeID, obj);
break;
case ASSIGNS:
case VOLUMES:
DisplayTreeDevice (TypeID, obj);
break;
case ALLFONTS:
DisplayAllFonts (TypeID, ClickedNode);
break;
case VOLLOCKS:
ModifyVolumeLock (TypeID, obj);
break;
case SYSINFO:
case HARDWARE:
case PREFS:
case ENVVARS:
case SYSVECTORS:
case E_PRINTERDATA:
case LIBRARYOFFS:
DisplayBeep (NULL);
break;
case MEMORY:
if (code < 3)
DisplayBeep (NULL);
else
Monitor (obj, ((RSYS_ScrollEntry *) ClickedNode)->se_Entry);
break;
default:
Monitor (obj, ((RSYS_ScrollEntry *) ClickedNode)->se_Entry);
break;
}
if (modified)
RefreshList (LastID);
PrintStatistics ();
return;
}